package com.king.zxing.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import java.util.HashMap;
import java.util.Objects;

public class BitmapUtil {
    //适用小范围
    private static HashMap<Integer,Bitmap> map = new HashMap<>();
    private static HashMap<String,Bitmap> map2 = new HashMap<>();

    //从res获取bitmap
    public static Bitmap getBitMap(Context context,int resId){
        if(map.containsKey(resId) && !Objects.requireNonNull(map.get(resId)).isRecycled()){
            return map.get(resId);
        }
        Bitmap bitMap = BitmapFactory.decodeResource(context.getResources(), resId);
        map.put(resId,bitMap);
        return bitMap;
    }

    public static int[] getBitmapWH(Bitmap bitmap){
        int[] wh = null;
        if(bitmap != null){
            wh = new int[2];
            wh[0] = bitmap.getWidth();
            wh[1] = bitmap.getHeight();
        }
        return wh;
    }

    public static Bitmap getBitmapFromPath(String path){
        if(map2.containsKey(path) && !Objects.requireNonNull(map2.get(path)).isRecycled()){
            return map2.get(path);
        }
         Bitmap bitmap = compress(path);
        map2.put(path,bitmap);
        return bitmap;
    }

    public static void clear(){
        for(Bitmap bitmap:map.values()){
            if(bitmap != null){
                bitmap.recycle();
            }
        }
        map.clear();
        for(Bitmap bitmap:map2.values()){
            if(bitmap != null){
                bitmap.recycle();
            }
        }
        map2.clear();
    }

    //压缩
    public static Bitmap compress(String srcPath) {
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        //开始读入图片，此时把options.inJustDecodeBounds 设回true了
        newOpts.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);//此时返回bm为空

        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        //现在主流手机比较多是800*480分辨率，所以高和宽我们设置为
        float hh = 800f;//这里设置高度为800f
        float ww = 480f;//这里设置宽度为480f
        //缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
        int be = 1;//be=1表示不缩放
        if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
            be = (int) (newOpts.outWidth / ww);
        } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
            be = (int) (newOpts.outHeight / hh);
        }
        if (be <= 0)
            be = 1;
        newOpts.inSampleSize = be;//设置缩放比例
        //重新读入图片，注意此时已经把options.inJustDecodeBounds 设回false了
        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);

        return bitmap;//压缩好比例大小后再进行质量压缩
        //return bitmap;
    }

}
